/**
 * can_lib.h
 * 
 * CAN通信库头文件，定义CAN相关的结构体、函数声明和常量
 */

#ifndef CAN_LIB_H
#define CAN_LIB_H

#include <stdint.h>
#include <linux/can.h>

// CAN设备名称默认值
#define DEFAULT_CAN_INTERFACE "can0"

// CAN通信波特率定义
#define CAN_BAUD_125K 125000
#define CAN_BAUD_250K 250000
#define CAN_BAUD_500K 500000
#define CAN_BAUD_1M 1000000

// 错误码定义
typedef enum {
    CAN_SUCCESS = 0,
    CAN_ERROR_OPEN = -1,
    CAN_ERROR_SETUP = -2,
    CAN_ERROR_SEND = -3,
    CAN_ERROR_RECEIVE = -4,
    CAN_ERROR_CLOSE = -5
} can_error_t;

// CAN消息结构体
typedef struct {
    uint32_t id;         // CAN ID
    uint8_t data[8];     // 数据内容
    uint8_t data_len;    // 数据长度(0-8)
    uint8_t is_extended; // 是否为扩展帧
    uint8_t is_remote;   // 是否为远程帧
} can_message_t;

/**
 * 初始化CAN接口
 * \param interface CAN接口名称(如"can0")
 * \param baud_rate CAN通信波特率
 * 
eturn 成功返回文件描述符，失败返回负数错误码
 */
int can_init(const char *interface, uint32_t baud_rate);

/**
 * 发送CAN消息
 * \param can_fd CAN接口文件描述符
 * \param msg 要发送的CAN消息
 * 
eturn 成功返回CAN_SUCCESS，失败返回负数错误码
 */
int can_send(int can_fd, const can_message_t *msg);

/**
 * 接收CAN消息
 * \param can_fd CAN接口文件描述符
 * \param msg 用于存储接收到的CAN消息
 * \param timeout_ms 接收超时时间(毫秒)，0表示非阻塞，负值表示无限等待
 * 
eturn 成功返回CAN_SUCCESS，失败返回负数错误码
 */
int can_receive(int can_fd, can_message_t *msg, int timeout_ms);

/**
 * 关闭CAN接口
 * \param can_fd CAN接口文件描述符
 * 
eturn 成功返回CAN_SUCCESS，失败返回负数错误码
 */
int can_close(int can_fd);

/**
 * 获取CAN错误信息
 * \param error_code 错误码
 * 
eturn 错误描述字符串
 */
const char *can_get_error_string(int error_code);

#endif /* CAN_LIB_H */